﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;

namespace RDD
{
    public partial class FactExpo : Form
    {
        private estadoPantalla _Estado = estadoPantalla.Consultar;
        public estadoPantalla Estado
        {
            get { return _Estado; }
            set
            {
                _Estado = value;
                switch (value)
                {
                    case estadoPantalla.Consultar:
                        #region Estado Consultar
                        deshabilitarControles();
                        lblEstado.Text = "Estado Pantalla : Consulta";
                        break;
                        #endregion
                    case estadoPantalla.Editar:
                        #region Estado Editar
                        habilitarControles();
                        lblEstado.Text = "Estado Pantalla : Editando";
                        txtFecha.Focus();
                        break;
                        #endregion
                    case estadoPantalla.Insertar:
                        #region Estado Insertar
                        habilitarControles();
                        lblEstado.Text = "Estado Pantalla : Insertando";
                        txtNumeFact.Focus();
                        break;
                        #endregion
                }
            }
        }

        //Declarar variables de la forma
        private DataSet dsGridDatos = new DataSet();
        Factura mFactura = new Factura();
        bool mListoGrid = false;
        private bool datosValidos = true;
        bool tEncontroNodo = false;
        UltraGridRow mFila;
        string tFiltroEstadoActual;

        #region Metodos Publicos
        public void buscarNodo()
        {
            foreach (TreeNode tNodo in trvItems.Nodes)
            {
                //Buscar importacion por valor
                tEncontroNodo = false;
                trvItems.SelectedNode = tNodo.Nodes[txtBuscar.Text];
                if (trvItems.SelectedNode != null)
                {
                    tEncontroNodo = true;
                    break;
                }
            }
            if (!tEncontroNodo)
            {
                MessageBox.Show("No se encontró el número de Factura : " + txtBuscar.Text, "RDD - Factura de Exportación");
            }
        }
        public FactExpo()
        {
            InitializeComponent();
        }
        public void refrescar()
        {
            //Llena el arbol con los parametros actuales
            mListoGrid = false;
            //Mostrar todas
            if (ddlFiltroEstado.ComboBox.SelectedValue.ToString() != "T")
            { ddlFiltroEstado.ComboBox.SelectedValue = "T"; }
            else
            { llenarArbol(); }
            this.Text = "Facturas de Exportación - " + Valores.gCiaNom;
        }
        #endregion Metodos Publicos

        #region Metodos privados
        private void adicionarNodoNuevo()
        {
            trvItems.Nodes[trvItems.Nodes.Count - 1].Nodes.Add("Nueva", "Nueva", 7, 8);
            trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
        }
        private void asignarPropiedades()
        {
            mFactura.FacturaID = txtNumeFact.Value.ToString();
            mFactura.Estado = Convert.ToChar(ddlEstado.Value);
            mFactura.Fecha = Convert.ToDateTime(txtFecha.Value);
            mFactura.BarcoID =  Convert.ToInt32(ddlBarco.Value);
            mFactura.Observacion = txtObservacion.Text;
            mFactura.IndLiq = chkIndLiq.Checked;
            //Calcular total cajas de la factura
            mFactura.TotalCajas = 0;
            DataTable dtGridDatos = dsGridDatos.Tables["DETFAC"];
            foreach (DataRow tFila in dtGridDatos.Rows)
            {
                if (tFila.RowState != DataRowState.Deleted)
                {
                    mFactura.TotalCajas += Convert.ToInt32(tFila["Cantidad"]);
                }
            }
            txtTotalCajas.Value = mFactura.TotalCajas;
        }
        private void configurarGrid()
        {
            #region DETFAC
                //Dar formato al grid banda 0 - Periodo
                UltraGridBand banda0 = grdDatos.DisplayLayout.Bands["DETFAC"];
                banda0.Override.HeaderAppearance.TextHAlign = Infragistics.Win.HAlign.Center;
                //Ocultar campos llave foranea
                banda0.Columns["CIACOD"].Hidden = true;
                banda0.Columns["FacturaID"].Hidden = true;
                banda0.Columns["FacturaID"].Header.Caption = "Factura";
                //Buscar los productos asociados a esta compañia
                Infragistics.Win.UltraWinGrid.UltraDropDown colCombo = new Infragistics.Win.UltraWinGrid.UltraDropDown();
                Articulo a = new Articulo();
                colCombo.DataSource = a.leerTodos(Valores.gCiaCod);
                colCombo.DisplayMember = "NOMBRE";
                colCombo.ValueMember = "REFERENCIA";
                colCombo.DisplayLayout.Bands[0].Columns["REFERENCIA"].Hidden = true;
                colCombo.DisplayLayout.Bands[0].Columns["NOMBRE"].Width = 180;
                //Configurar Celda ComboBox
                banda0.Columns["REFERENCIA"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownValidate;
                banda0.Columns["REFERENCIA"].Width = 180;
                banda0.Columns["REFERENCIA"].Header.Caption = "Referencia";
                banda0.Columns["REFERENCIA"].ValueList = colCombo;
                //Cantidad Importada
                banda0.Columns["CANTIDAD"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerNonNegative;
                banda0.Columns["CANTIDAD"].MaskInput = "nn,nnn,nnn";
                banda0.Columns["CANTIDAD"].MaxValue = 899999;
                banda0.Columns["CANTIDAD"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
                banda0.Columns["CANTIDAD"].Format = "###,##0";
                banda0.Columns["CANTIDAD"].Header.Caption = "Cantidad";
                //Borrar
                banda0.Columns["BORRAR"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox;
                banda0.Columns["BORRAR"].DefaultCellValue = false;
                banda0.Columns["BORRAR"].Header.Caption = "Borrar";
                banda0.Columns["BORRAR"].Width = 70;
                //Ocultar indicadores de Actualizar e Insertar
                banda0.Columns["ACT"].Hidden = true;
                banda0.Columns["INS"].Hidden = true;
                mListoGrid = true;
            #endregion DETFAC
            #region RelacionImport
                //Configurar banda de Relacion de importaciones
                UltraGridBand banda2 = grdDatos.DisplayLayout.Bands["RelacionImport"];
                //banda2.CardView = true;
                banda2.CardSettings.ShowCaption = false;
                banda2.Override.HeaderAppearance.BackColor = Color.LightBlue;
                //Cambiar la alineacion de los encabezados en todo el grid
                banda2.Columns["CiaCod"].Hidden = true;
                banda2.Columns["FacturaID"].Hidden = true;
                banda2.Columns["ArticuloID"].Hidden = true;
                banda2.Columns["ImportID"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
                banda2.Columns["ImportID"].Header.Caption = "ImportID";
                //Fecha
                banda2.Columns["Fecha"].Width = 80;
                banda2.Columns["Fecha"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
                banda2.Columns["Fecha"].Header.Caption = "Fecha";
                //Cantidad
                banda2.Columns["Cantidad"].Width = 80;
                banda2.Columns["Cantidad"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
                banda2.Columns["Cantidad"].Format = "#,##0";
                banda2.Columns["Cantidad"].Header.Caption = "Cantidad";
            #endregion RelFacImp
        }
        private void deshabilitarControles()
        {
            //No permitir modificar el contenido de los controles
            txtNumeFact.Enabled = false;
            ddlEstado.Enabled = false;
            txtFecha.Enabled = false;
            ddlBarco.Enabled = false;
            chkIndLiq.Enabled = false;
            txtObservacion.Enabled = false;
            //No puede insertar filas o modificar los valores del grid
            grdDatos.DisplayLayout.Override.AllowAddNew = AllowAddNew.No;
            grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.False;
            grdDatos.DisplayLayout.Bands["DetFac"].Columns["Borrar"].Hidden = true;
            //En caso de estar visible una nueva fila sin datos, se elimina
            grdDatos.PerformAction(UltraGridAction.UndoRow);
            btnEditar.Enabled = true;
            btnSalvar.Enabled = false;
            if (mFactura.Estado == 'D' || mFactura.Estado == 'C')
            {
                mnuConfDesc.Enabled = true;
                if (mFactura.Estado == 'D')
                {
                    mnuConfirmar.Enabled = true;
                    mnuDesconfirmar.Enabled = false;
                }
                else if (mFactura.Estado == 'C')
                {
                    mnuConfirmar.Enabled = false;
                    mnuDesconfirmar.Enabled = true;
                }
            }
            else
            {
                mnuConfDesc.Enabled = false;
            }
            //if (ddlEstado.Text != "D") { btnImprimir.Enabled = true; }
            btnBorrar.Enabled = (ddlEstado.Value.ToString() == "D");
            ddlFiltroEstado.Enabled = true;
            btnInsertar.Enabled = true;
            btnCancelar.Enabled = false;
            cmdBuscar.Enabled = true;
        }
        private void habilitarControles()
        {
            //Permite modificar el contenido de los controles
            if (Estado == estadoPantalla.Insertar)
            {
                txtNumeFact.Enabled = true;
            }
            if (ddlEstado.Value.ToString() == "D")
            {
                txtFecha.Enabled = true;
                chkIndLiq.Enabled = true;
            }
            ddlBarco.Enabled = true;
            txtObservacion.Enabled = true;
            //Permitir editar las columnas del grid modificables, si no hay facturas de exportacion asociadas
            if (ddlEstado.Value.ToString() == "D" || Estado == estadoPantalla.Insertar)
            {
                UltraGridBand banda0 = grdDatos.DisplayLayout.Bands["DetFac"];
                grdDatos.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom;
                grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.Default;
                banda0.Columns["REFERENCIA"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands["RelacionImport"].Hidden = true;
            }
            btnEditar.Enabled = false;
            btnSalvar.Enabled = true;
            btnBorrar.Enabled = false;
            ddlFiltroEstado.Enabled = false;
            btnInsertar.Enabled = false;
            btnCancelar.Enabled = true;
            cmdBuscar.Enabled = false;
        }
        private void limpiarControles()
        {
            //Inicializa valores de los controles
            //Para cada control en la forma, asignar el valor de la propiedad
            txtNumeFact.Value = 0;
            ddlEstado.Value = "D";
            txtFecha.Value = DateTime.Today;
            ddlBarco.SelectedIndex = 0;
            txtObservacion.Text = "";
            txtNumeExpo.Text = "";
            txtFechExpo.Value = null;
            //Borrar datos del grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear();
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            grdDatos.DataSource = dsGridDatos;
            //Labels de totales calculados
            txtTotalCajas.Value = 0;
        }
        private void llenarListas()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Llenar listas de Barcos
                ddlBarco.DataSource = mFactura.leerBarcos();
                ddlBarco.DisplayMember = "NOMBRE";
                ddlBarco.ValueMember = "CODIGO";

                //Llenar lista de Estados
                List<miComboItem> listaEstado = new List<miComboItem>();
                listaEstado.Add(new miComboItem("D", "Digitada"));
                listaEstado.Add(new miComboItem("C", "Confirmada"));
                //listaEstado.Add(new miComboItem("E", "Exportada"));
                listaEstado.Add(new miComboItem("V", "Verificada"));

                ddlEstado.DataSource = listaEstado;
                ddlEstado.DisplayMember = "texto";
                ddlEstado.ValueMember = "valor";

                //Llenar lista de filtro por estados, adicionar primero el item Todos
                listaEstado.Insert(0, new miComboItem("T", "Todas"));
                ddlFiltroEstado.ComboBox.DataSource = listaEstado;
                ddlFiltroEstado.ComboBox.ValueMember = "valor";
                ddlFiltroEstado.ComboBox.DisplayMember = "texto";
                ddlFiltroEstado.SelectedIndex = -1;
                ddlFiltroEstado.ComboBox.SelectedValue = "T";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al mostrar lista de valores : " + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }
        private void llenarArbol()
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                int tAnno = 0;
                int tIndice = -1;
                int tImgIndex;
                string tKey;
                DataTable tDatos = mFactura.leerFacturas(Valores.gCiaCod, ddlFiltroEstado.ComboBox.SelectedValue.ToString());
                //Mostrarlas en el arbol
                if (tDatos.Rows.Count > 0)
                {
                    lblTotReg.Text = tDatos.Rows.Count + " registros";
                    trvItems.Nodes.Clear();
                    foreach (DataRow tFila in tDatos.Rows)
                    {
                        if (tAnno != Convert.ToInt16(tFila["Anno"]))
                        {
                            //Insertar nuevo nodo principal de año
                            tAnno = Convert.ToInt16(tFila["Anno"]);
                            tKey = tAnno.ToString();
                            trvItems.Nodes.Add(new TreeNode(tKey, 0, 0));
                            tIndice += 1;
                        }
                        //Adicionar nodo del numero de importacion
                        tKey = tFila["FacturaID"].ToString().TrimEnd();
                        switch (Convert.ToChar(tFila["Estado"]))
                        {
                            case 'D':
                                tImgIndex = 5;
                                break;
                            case 'C':
                                tImgIndex = 3;
                                break;
                            //case 'E':
                            //    tImgIndex = 9;
                            //    break;
                            case 'V':
                                tImgIndex = 11;
                                break;
                            default:
                                tImgIndex = 13;
                                break;
                        }
                        trvItems.Nodes[tIndice].Nodes.Add(tKey, tKey, tImgIndex, tImgIndex + 1);
                    }
                    trvItems.SelectedNode = trvItems.Nodes[tIndice].LastNode;
                    tFiltroEstadoActual = ddlFiltroEstado.ComboBox.SelectedValue.ToString();
                }
                else
                {
                    MessageBox.Show("No existen Facturas en el estado indicado. Operación cancelada.", "RDD - Facturas de Exportación");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error llenando las Facturas: " + ex.Message, "RDD - Facturas de Exportación");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void mostrarRegistro()
        {
            //Para cada control en la forma, asignar el valor de la propiedad
            txtNumeFact.Value = mFactura.FacturaID;
            ddlEstado.Value = mFactura.Estado;
            txtFecha.Value = mFactura.Fecha;
            ddlBarco.Value = mFactura.BarcoID;
            chkIndLiq.Checked = mFactura.IndLiq;
            txtNumeExpo.Value = mFactura.ExportID;
            txtFechExpo.Value = mFactura.FechExpo;
            txtObservacion.Text = mFactura.Observacion;
            //Leer registro del detalle y asignarlo al datatable asociado al grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear(); 
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            dsGridDatos = mFactura.leerDetalle();
            grdDatos.DataSource = dsGridDatos;
            //grdDatos.DataMember = "DETFAC";
            if (!mListoGrid)
            {
                //Si no se ha configurado el grid debe hacerse
                configurarGrid();
            }
            //Calcular total cajas de la factura
            //mFactura.TotalCajas = 0;
            //DataTable dtGridDatos = dsGridDatos.Tables["DETFAC"];
            //foreach (DataRow tFila in dtGridDatos.Rows)
            //{
            //    mFactura.TotalCajas += Convert.ToInt32(tFila["Cantidad"]);
            //}
            txtTotalCajas.Value = mFactura.TotalCajas;
            if (mFactura.Estado != 'D')
            {
                grdDatos.DisplayLayout.Bands["RelacionImport"].Hidden = false;
            }
            else
            {
                grdDatos.DisplayLayout.Bands["RelacionImport"].Hidden = true;
            }
            this.Estado = estadoPantalla.Consultar;
        }        
        private bool validarDatosGrid(UltraGridRow pFila)
        {
            bool tResultado = true;
            string tMensaje = "";
            string tColumna = "";

            //Validar Referncia
            if (pFila.Cells["Referencia"].Value.ToString() == "")
            {
                tMensaje = "La referencia es un campo obligatorio.";
                tColumna = "Referencia";
            }
            //Cantidad Importada
            else if (pFila.Cells["CANTIDAD"].Value.ToString() == "")
            {
                tMensaje = "La cantidad facturada es un campo obligatorio.";
                tColumna = "CANTIDAD";
            }
            //Ocurrió un error. Mostrar el mensaje personalizado y activar celda con el error.
            if (tMensaje != "")
            {
                MessageBox.Show("Datos no válidos : " + tMensaje, "Actualizar Datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdDatos.ActiveRow.Cells[tColumna].Activate();
                grdDatos.PerformAction(UltraGridAction.EnterEditMode);
                tResultado = false;
            }
            return tResultado;
        }
        private bool validarDatos()
        {
            //Validar datos del registro encabezado
            string tMensaje = "";
            object tControl = new object();
            //Numero de importacion
            if (txtNumeFact.Value.ToString().Length == 0)
            {
                tMensaje = "El número de Factura es obligatorio. Favor ingresar número válido";
                txtNumeFact.Focus();
            }
            else if (Convert.ToDateTime(txtFecha.Value).Date > DateTime.Today)
            {
                tMensaje = "La fecha de la Factura no puede ser mayor a la fecha actual. Favor corregir y volver a intentar.";
                txtFecha.Focus();
            }
            if (tMensaje.Length > 0)
            {
                MessageBox.Show("Error : " + tMensaje, "Facturas de Exportación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion Metodos privados

        #region Eventos
        private void btnBorrar_Click(object sender, EventArgs e)
        {
            DialogResult mensaje = MessageBox.Show("Se va a borrar la Factura de Exportación # " + mFactura.FacturaID + " ¿Esta seguro?", "Facturas de Exportación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (mensaje == DialogResult.Yes)
            {
                try
                {
                    mFactura.borrarRegistro();
                    trvItems.SelectedNode.Remove();
                    trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
                    MessageBox.Show("La Factura de Exportación fue borrada exitosamente.", "RDD - Borrar Factura de Exportación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(Constantes.FALLA + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (Estado == estadoPantalla.Insertar)
            {
                //Borrar nodo nuevo del arbol
                trvItems.SelectedNode.Remove();
                Estado = estadoPantalla.Consultar;
                trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
            }
            else
            {
                //Cancelar edicion
                mostrarRegistro();
            }
        }
        private void btnEditar_Click(object sender, EventArgs e)
        {
            //Habilitar los campos para edicion
            Estado = estadoPantalla.Editar;
        }
        private void btnInsertar_Click(object sender, EventArgs e)
        {
            limpiarControles();
            adicionarNodoNuevo();
            Estado = estadoPantalla.Insertar;
        }         
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Validar datos de la maestra
                if (validarDatos())
                {
                    //Salvar los cambios en el grid, si hay
                    datosValidos = true;
                    grdDatos.UpdateData();
                    if (datosValidos)
                    {
                        asignarPropiedades();
                        mFactura.FechModi = DateTime.Now;
                        mFactura.UsuaModi = Valores.USUARIO;
                        DataTable dtGridDatos = dsGridDatos.Tables["DETFAC"];
                        if (Estado == estadoPantalla.Insertar)
                        {
                            if (mFactura.insertarRegistro(dtGridDatos))
                            {
                                //Volver a crear el arbol
                                txtBuscar.Text = txtNumeFact.Value.ToString();
                                this.Estado = estadoPantalla.Consultar;
                                llenarArbol();
                                buscarNodo();
                            }
                        }
                        else if (Estado == estadoPantalla.Editar)
                        {
                            mFactura.actualizarRegistro(dtGridDatos);
                            this.Estado = estadoPantalla.Consultar;
                        }
                        //Volver a estado Consulta
                        MessageBox.Show(Constantes.EXITOSO + " Cambios salvados. ", "Salvar Cambios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un Error al salvar el registro." + ex.Message, "Facturas de Exportación", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void chkCardView_CheckedChanged(object sender, EventArgs e)
        {
            grdDatos.DisplayLayout.Bands["RelacionImport"].CardView = chkCardView.Checked;
        }
        private void cmdBuscar_Click(object sender, EventArgs e)
        {
            buscarNodo();
        }
        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            btnCancelar.PerformClick();
        }
        private void cmdVerPolExp_Click(object sender, EventArgs e)
        {
            if (txtNumeExpo.Text.Length > 0 && txtNumeExpo.Text != "0")
            {
                //Mostrar importación seleccionada
                MDIPrincipal tForma = ((MDIPrincipal)this.ParentForm);
                //Verificar si ya está visible la forma
                if (tForma.fPoliExpo == null || tForma.fPoliExpo.IsDisposed)
                {
                    //Cargar en memoria la forma
                    tForma.fPoliExpo = new PoliExpo();
                    tForma.fPoliExpo.MdiParent = tForma;
                    tForma.fPoliExpo.Show();
                }
                //Buscar importacion en el arbol
                tForma.fPoliExpo.txtBuscar.Text = txtNumeExpo.Text;
                tForma.fPoliExpo.buscarNodo();
                tForma.fPoliExpo.WindowState = FormWindowState.Normal;
                tForma.fPoliExpo.Focus();
            }
        }
        private void ddlEstado_SelectionChanged(object sender, EventArgs e)
        {
            //Asignar al nodo el icono que le corresponde, de acuerdo al estado
            if (ddlEstado.Value != null && trvItems.SelectedNode != null)
            {
                char tEstado = Convert.ToChar(ddlEstado.Value);
                int tImgIndex;
                switch (tEstado)
                {
                    case 'D':
                        tImgIndex = 5;
                        break;
                    case 'C':
                        tImgIndex = 3;
                        break;
                    case 'V':
                        tImgIndex = 11;
                        break;
                    default:
                        tImgIndex = 13;
                        break;
                }
                trvItems.SelectedNode.ImageIndex = tImgIndex;
                trvItems.SelectedNode.SelectedImageIndex = tImgIndex + 1;
            }
        }
        private void ddlFiltroEstado_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlFiltroEstado.SelectedIndex >= 0 && ddlFiltroEstado.ComboBox.ValueMember.Length > 0)
            {
                if (ddlFiltroEstado.ComboBox.SelectedValue.ToString() != tFiltroEstadoActual)
                { llenarArbol(); }
                ddlFiltroEstado.ComboBox.SelectedValue = tFiltroEstadoActual;
                return;
            }
        }
        private void FactExpo_Load(object sender, EventArgs e)
        {
            this.trvItems.ImageList = ((MDIPrincipal)this.ParentForm).imlImagenes;
            //Llenar listas
            llenarListas();
            this.Text = "Facturas de Exportación - " + Valores.gCiaNom;
        }
        private void mnuConfirmar_Click(object sender, EventArgs e)
        {
            //Verificar si desea Confirmar factura
            if (mFactura.Estado == 'D')
            {
                //Validar si hay registros en el detalle
                if (grdDatos.Rows.Count <= 0)
                {
                    MessageBox.Show("No se puede confirmar una Factura sin Articulos relacionados.", "Confirmar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    DialogResult mensaje = MessageBox.Show("Esta acción modificará los saldos de las importaciones. ¿Desea realmente confirmar?", "Cofirmar Factura de Exportación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                    if (mensaje == DialogResult.Yes)
                    {
                        try
                        {
                            this.Cursor = Cursors.WaitCursor;
                            //Llamar al procedimiento que Confirma la factura
                            if (mFactura.confirmarFactura(dsGridDatos))
                            {
                                txtBuscar.Text = mFactura.FacturaID;
                                llenarArbol();
                                buscarNodo();
                                txtBuscar.Text = "";
                                MessageBox.Show("Confirmación Exitosa. Las importaciones fueron actualizadas.", "Confirmar Facturas", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Error al confirmar Factura." + ex.Message, "Confirmar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        finally
                        { this.Cursor = Cursors.Default; }
                    }
                }
            }
        }
        private void mnuDesconfirmar_Click(object sender, EventArgs e)
        {
            if (mFactura.Estado == 'C')
            {
                DialogResult mensaje = MessageBox.Show("Esta acción modificará los saldos de las importaciones. ¿Desea realmente desconfirmar la factura?", "Desconfirmar Factura de Exportación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (mensaje == DialogResult.Yes)
                {
                    //Desconfirmar Factura
                    try
                    {
                        this.Cursor = Cursors.WaitCursor;
                        //Llamar al procedimiento que Confirma la factura
                        string tCiaCod = Valores.gCiaCod.ToString();
                        if (mFactura.desconfirmarFactura(tCiaCod, mFactura.FacturaID))
                        {
                            txtBuscar.Text = mFactura.FacturaID;
                            llenarArbol();
                            buscarNodo();
                            txtBuscar.Text = "";
                            MessageBox.Show("Operación Exitosa. Se Desconfirmó la factura y las importaciones fueron actualizadas.", "Desconfirmar Facturas", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al Desconfirmar Factura." + ex.Message, "Desconfirmar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    { this.Cursor = Cursors.Default; }
                }
            }
        }
        private void mnuImprimir_Click(object sender, EventArgs e)
        {
            if (mFactura.Estado != 'D')
            {
                try
                {
                    this.Cursor = Cursors.WaitCursor;
                    preRelFacImp rep = new preRelFacImp(mFactura.CiaCod, mFactura.FacturaID);
                    rep.ShowDialog();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "RDD - Imprimir Factura ");
                }
                finally
                { this.Cursor = Cursors.Default; }
            }
            else
            {
                MessageBox.Show("No se pueden imprimir facturas que no tienen Importaciones asociadas.", "Imprimir relación Facturas", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void mnuMarcarFilaBorrar_Click(object sender, EventArgs e)
        {
            if (!Convert.ToBoolean(mFila.Cells["INS"].Value))
            {
                mFila.Cells["BORRAR"].Value = !Convert.ToBoolean(mFila.Cells["BORRAR"].Value);
                if (Convert.ToBoolean(mFila.Cells["BORRAR"].Value))
                {
                    //Esta marcado para borrar, cambiar color
                    mFila.Appearance.BackColor = Color.LightCoral;
                }
                else
                {
                    mFila.Appearance.BackColor = Color.White;
                }
            }
            else
            {
                //No se puede borrar una fila nueva
                MessageBox.Show("No se puede marcar para borrar una fila nueva", "RDD - Detalle Factura", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void trvItems_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                if (e.Node.FullPath.Length > 4 && e.Node.Text != "Nueva")
                {
                    //Mostrar los valores de la importacion seleccionda
                    string tNumero = trvItems.SelectedNode.Text;
                    mFactura.leerRegistro(Valores.gCiaCod, tNumero);
                    mostrarRegistro();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "RDD - Facturas de Exportación");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void trvItems_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            tEncontroNodo = true;
            if (Estado != estadoPantalla.Consultar && e.Node.FullPath.Length > 4)
            {
                DialogResult mensaje = MessageBox.Show("Los cambios no se han salvado. ¿Desea realmente salir?", "Facturas de Exportación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (mensaje == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else if (Estado == estadoPantalla.Insertar)
                {
                    //Borrar el nodo acual
                    trvItems.SelectedNode.Remove();
                }
            }
        }
        #endregion Eventos

        #region Eventos del Grid
        private void grdDatos_AfterRowUpdate(object sender, RowEventArgs e)
        {
            //Desactivar la columna con la llave, despues de salvar la fila
            e.Row.Cells["REFERENCIA"].Activation = Activation.ActivateOnly;
        }
        private void grdDatos_AfterRowInsert(object sender, RowEventArgs e)
        {
            //Asignar valores llave foranea
            e.Row.Cells["CiaCod"].Value = Valores.gCiaCod;
            e.Row.Cells["FacturaID"].Value = txtNumeFact.Value;
            //Activar celda con llave primaria
            e.Row.Cells["REFERENCIA"].IgnoreRowColActivation = true;
            e.Row.Cells["REFERENCIA"].Activation = Activation.AllowEdit;
            e.Row.Cells["REFERENCIA"].Activate();
            //No permitir modificar la columna de borrar
            e.Row.Cells["BORRAR"].Activation = Activation.Disabled;
            grdDatos.PerformAction(UltraGridAction.EnterEditMode);
            e.Row.Cells["INS"].Value = true;
            e.Row.Cells["ACT"].Value = false;
        }
        private void grdDatos_BeforeRowUpdate(object sender, CancelableRowEventArgs e)
        {
            try
            {
                mFila = grdDatos.Rows[e.Row.Index];
                if (!validarDatosGrid(mFila))
                {
                    e.Cancel = true;
                    datosValidos = false;
                }
                else
                {
                    if (!Convert.ToBoolean(mFila.Cells["INS"].Value))
                    {
                        //Se salvo una fila que ya exsitia, se marca como modificada
                        mFila.Cells["ACT"].Value = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrion un error al salvar los datos de la fila : " + ex.Message,
                    "Actualizar Datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                e.Cancel = true;
                datosValidos = false;
            }
        }
        private void grdDatos_BeforeCellActivate(object sender, CancelableCellEventArgs e)
        {
            if (e.Cell.Band.Key == "DETFAC" && Convert.ToBoolean(e.Cell.Row.Cells["BORRAR"].Value))
            {
                e.Cancel = true;
            }
        }
        private void grdDatos_DoubleClickRow(object sender, DoubleClickRowEventArgs e)
        {
            if (Estado == estadoPantalla.Consultar)
            {
                if (e.Row.Band.Key == "RelacionImport")
                {
                    //Mostrar importación seleccionada
                    MDIPrincipal tForma = ((MDIPrincipal)this.ParentForm);
                    //Verificar si ya está visible la forma
                    if (tForma.fRegiImpo == null || tForma.fRegiImpo.IsDisposed)
                    {
                        //Cargar en memoria la forma
                        tForma.fRegiImpo = new RegiImpo();
                        tForma.fRegiImpo.MdiParent = tForma;
                        tForma.fRegiImpo.Show();
                    }
                    //Buscar importacion en el arbol
                    tForma.fRegiImpo.txtBuscar.Text = e.Row.Cells["ImportID"].Value.ToString();
                    tForma.fRegiImpo.buscarImportacion();
                    tForma.fRegiImpo.WindowState = FormWindowState.Normal;
                    tForma.fRegiImpo.Focus();
                }
            }
        }
        private void grdDatos_Error(object sender, ErrorEventArgs e)
        {
            string tMensaje = "Ocurrio un Error en los datos del Grid. " + e.ErrorText;
            if (e.ErrorType == ErrorType.Data)
            {
                //Error de datos al salvar la fila de datos
                if (e.DataErrorInfo.Source == DataErrorSource.RowUpdate)
                {
                    if (e.ErrorText.Contains("MaestraDetalle"))
                    {
                        tMensaje = "No existe una factura para para este detalle.";
                    }
                    else if (e.ErrorText.Contains("REFERENCIA"))
                    {
                        tMensaje = "Referencia no puede repetirse. Ya existe una fila con el valor seleccionado.";
                    }
                }
                else if (e.DataErrorInfo.Source == DataErrorSource.CellUpdate)
                {
                    if (e.DataErrorInfo.Cell.Column.Key == "REFERENCIA")
                        tMensaje = "Referencia invalida. Debe seleccionar una Referencia de la lista.";
                }

                //Cancelar el error para que podamos desplegar un mensaje personalizado
                e.Cancel = true;
                MessageBox.Show(this, tMensaje, "Error en el Grid", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdDatos.ActiveRow.Cells["REFERENCIA"].Activate();
                grdDatos.PerformAction(UltraGridAction.EnterEditMode);
                datosValidos = false;
            }
        }
        private void grdDatos_KeyUp(object sender, KeyEventArgs e)
        {
            //Hacer que el Enter funcione como el TAB
            if (e.KeyCode == Keys.Enter)
            {
                grdDatos.PerformAction(UltraGridAction.ExitEditMode, false, false);
                grdDatos.PerformAction(UltraGridAction.NextCellByTab, false, false);
                e.Handled = true;
                grdDatos.PerformAction(UltraGridAction.EnterEditMode, false, false);
            }
        }        
        private void grdDatos_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                Point mousePoint = new Point(e.X, e.Y);
                UIElement element = ((UltraGrid)sender).DisplayLayout.UIElement.ElementFromPoint(mousePoint);
                UltraGridCell cell = element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
                if (cell != null && Estado != estadoPantalla.Consultar && ddlEstado.Value.ToString() == "D")
                {
                    mFila = cell.Row;
                    //this.mnuGrid.Show(mousePoint.X + grdDatos.Left, mousePoint.Y + grdDatos.Top);
                    this.mnuGrid.Show(mousePoint.X + groupBox3.Left + pnlDerecho.Left + this.Location.X, mousePoint.Y + groupBox3.Location.Y + groupBox1.Height - pnlDerecho.Location.Y + this.Location.Y);
                    //this.mnuGrid.Show(mousePoint.X + grbFacturas.Left + splContenedor.Panel2.Left + this.Location.X, mousePoint.Y + grbFacturas.Location.Y + groupBox1.Height - splContenedor.Location.Y + this.Location.Y);
                }
            }
        }
        #endregion Eventos del Grid

    }
}
